package Dao.impl;

import java.util.Date;
import java.util.List;

import javax.persistence.Query;

import Bean.Cliente;
import Bean.OrdemDeServico;
import Bean.Produto;
import Bean.ProdutoItem;
import Bean.StatusOrdem;
import Bean.TipoItem;
import Dao.DaoFactory;
import Dao.interfaces.IOrdemDeServicoDao;
import exception.CrudException;

public class OrdemDeServicoDaoImpl extends GenericCrud<OrdemDeServico> implements IOrdemDeServicoDao {

	@Override
	public OrdemDeServico carregar(Long id) throws CrudException {
		return carregar(OrdemDeServico.class, id);
	}

	@Override
	public List<OrdemDeServico> carregarTodos() throws CrudException {
		return carregarTodos(OrdemDeServico.class);
	}

	@Override
	public void excluir(Long id) throws CrudException {
		excluir(OrdemDeServico.class, id);
	}
	
	
	@Override
	public List<OrdemDeServico> carregarPorParametros(Cliente c, int status, int situacaoPagamento, Date dataI, Date dataF) throws CrudException {
		em = emf.createEntityManager();	
		List<OrdemDeServico> lista;
		boolean temParametro = false;
		String query = "SELECT o FROM OrdemDeServico o";
		
		if(dataF != null){
			if(temParametro)
				query += " and o.dataOrdem <= :dataFim";
			else{
				query += " where o.dataOrdem <= :dataFim";
				temParametro = true;
			}
		}
		if(dataI != null){
			if(temParametro)
				query += " and o.dataOrdem >= :dataInicio";
			else{
				query += " where o.dataOrdem >= :dataInicio";
				temParametro = true;
			}	
		}
		
		if(c != null){
			if(temParametro)
				query += " and o.cliente = :cliente";
			else{
				query += " where o.cliente = :cliente";
				temParametro = true;
			}	
		}
		if(status != 4){
			if(temParametro)
				query += " and o.status = :status";
			else{
				query += " where o.status = :status";
				temParametro = true;
			}	
		}
		if(situacaoPagamento == 1){
			if(temParametro)				
				query += " and o.dataPagamento is not null";
			else{
				query += " where o.dataPagamento is not null";
				temParametro = true;
			}
		}
		if(situacaoPagamento == 2){
			if(temParametro)				
				query += " and o.dataPagamento is null";
			else{
				query += " where o.dataPagamento is null";
				temParametro = true;
			}
		}
		
		Query query2 = em.createQuery(query);
		if (dataI != null)
			query2.setParameter("dataInicio", dataI);
		if (dataF != null)
			query2.setParameter("dataFim", dataF);
		if(c != null)
			query2.setParameter("cliente", c);		
		if (status != 4){
			if(status == 1)
				query2.setParameter("status", StatusOrdem.ORCAMENTO);
			if(status == 2)
				query2.setParameter("status", StatusOrdem.EXECUTANDO);
			if(status == 3)
				query2.setParameter("status", StatusOrdem.FECHADA);
		}
			
		
		lista = query2.getResultList();
		em.close();
		return lista;
	}

	@Override
	public void fecharOS(OrdemDeServico obj) throws CrudException {
		atualizar(obj);
		em = emf.createEntityManager();
		em.getTransaction().begin();
		for (ProdutoItem item : obj.getItens()) {
			if(item.getProduto().getTipoItem() == TipoItem.PECA){
				Produto p = DaoFactory.getProdutoDao().carregar(item.getProduto().getId());
				p.setQtdEstoque(p.getQtdEstoque()-item.getQuantidade());
				em.merge(p);
			}
		}
		em.getTransaction().commit();
		em.close();
	}

}
